package code16_thread;

public class Test09 {

	public static void main(String[] args) {
		P1 p1 = new P1();
		p1.start();
		P2 p2 = new P2();
		p2.start();
	}
	
}

enum Room {
	/**
	 * 钥匙A,B
	 */
	KEYA, KEYB;
}
class P1 extends Thread {
	@Override
	public void run() {
		// 有死锁
		// 先到 A门, 再到 B门, 最后宝箱
		synchronized (Room.KEYA) {
			System.out.println("拿到KEYA, 准备拿 KEYB...");
			try {
				Thread.sleep(1000);// 休息, 确保另一个线程获取到其对应的锁对象
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (Room.KEYB) {
				System.out.println("拿到KEYB, 打开宝箱...");
			}
		}
		
		// 无死锁
		// 先到 B门, 再到 A门, 最后宝箱
//		synchronized (Room.KEYB) {
//			System.out.println("拿到KEYB, 准备拿 KEYA...");
//			try {
//				Thread.sleep(1000);// 休息, 确保另一个线程获取到其对应的锁对象
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//			}
//			synchronized (Room.KEYA) {
//				System.out.println("拿到KEYA, 打开宝箱...");
//			}
//		}
	}
}
class P2 extends Thread {
	@Override
	public void run() {
		// 先到 B门, 再到 A门, 最后宝箱
		synchronized (Room.KEYB) {
			System.out.println("拿到KEYB, 准备拿 KEYA...");
			try {
				Thread.sleep(1000);// 休息, 确保另一个线程获取到其对应的锁对象
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (Room.KEYA) {
				System.out.println("拿到KEYA, 打开宝箱...");
			}
		}
	}
}